`
https://leetcode.cn/problems/count-complete-tree-nodes/
`

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var countNodes = function (root) {
  let l = root, r = root;
  // 沿最左侧和最右侧分别计算高度
  let hl = 0, hr = 0;
  while (l !== null) {
    l = l.left;
    hl++;
  }
  while (r !== null) {
    r = r.right;
    hr++;
  }
  // 如果左右侧计算的高度相同，则是一棵满二叉树
  if (hl === hr) {
    return Math.pow(2, hl) - 1;
  }
  // 如果左右侧的高度不同，则按照普通二叉树的逻辑计算
  // 这两个递归并不会全部计算完，因为完全二叉树的左右子树必定有一颗是满二叉树
  // 所以该算法的时间复杂度为 O(logN * logN)
  return 1 + countNodes(root.left) + countNodes(root.right)
};